package base

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

// TCP 服务端
func TcpServer() {
	// 监听端口
	listen,err := net.Listen("tcp", "127.0.0.1:8866")
	if err != nil {
		fmt.Println("监听端口错误", err)
		return
	}

	defer listen.Close()
	for {
		// 阻塞等待用户连接
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("创建连接失败: ", err)
			return
		}
		// 创建协程处理连接
		go process(conn)
	}
}

// 服务器连接处理函数
func process(conn net.Conn) {
	defer conn.Close()
	for {
		// 持续接收用户的请求
		buf := make([]byte, 1024)
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println("接收用户请求失败: ", err)
			break
		}

		content := string(buf[:n]);
		fmt.Println("接收到的内容, buf= ", content)
		// 将消息回执给对方
		conn.Write([]byte("服务器收到了: " + content))
	}
}

// TCP 客户端
func TcpClient() {
	// 连接服务器
	conn, err := net.Dial("tcp", "127.0.0.1:8866")
	if err != nil {
		fmt.Println("客户端连接服务器错误: ", err)
		return
	}

	defer conn.Close()

	inputReader := bufio.NewScanner(os.Stdin)
	for inputReader.Scan() {
		// 读取用户输入
		input := inputReader.Text()
		inputVal := strings.Trim(input, "\r\n")
		fmt.Println("输入内容", inputVal)
		if inputVal == "" {
			fmt.Println("输入内容不能为空")
			break
		}
		// 如果输入q就退出
		if strings.ToUpper(inputVal) == "Q" {
			break
		}
		fmt.Println("发送的内容, contetn = ", inputVal)
		_,err := conn.Write([]byte(inputVal))
		if err != nil {
			fmt.Println("发送内容失败, ", err)
			break
		}
		buf := make([]byte, 1024)
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println("客户端接收消息失败", err)
			break
		}
		content := string(buf[:n])
		fmt.Println("客户端接收消息content=", content)
	}

}